package com.example.xiongmao.utils;

import io.jsonwebtoken.*;

import java.nio.charset.StandardCharsets;
import java.util.Date;
import java.util.Map;
import java.util.Objects;


public class JwtUtils {

    /**
     * 生成jwt
     * 使用Hs256算法, 私匙使用固定秘钥
     * @param secretKey  jwt秘钥
     * @param ttlMillis  jwt过期时间(毫秒)
     * @param claims     设置的信息
     * @return
     */
    public static String createJwt(String secretKey , long ttlMillis, Map<String, Object> claims){
        // 指定签名的时候使用的签名算法，也就是header那部分
        SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;

        // 生成jwt时间
        long expMillis = System.currentTimeMillis()+ ttlMillis;
        Date exp = new Date(expMillis);

        JwtBuilder jwtBuilder = Jwts.builder().setClaims(claims).signWith(signatureAlgorithm, secretKey.getBytes(StandardCharsets.UTF_8)).setExpiration(exp);
        return jwtBuilder.compact();
    }

    /**
     * Token解密
     *
     * @param secretKey jwt秘钥 此秘钥一定要保留好在服务端, 不能暴露出去, 否则sign就可以被伪造, 如果对接多个客户端建议改造成多个
     * @param token     加密后的token
     * @return
     */
    public static Claims parseJWT(String secretKey, String token) {
        // 1.校验token是否为空，返回401异常
        if (Objects.isNull(token)) {
            throw new UnsupportedOperationException("未登录");
        }
        // 得到DefaultJwtParser
        Claims claims = Jwts.parser()
                // 设置签名的秘钥
                .setSigningKey(secretKey.getBytes(StandardCharsets.UTF_8))
                // 设置需要解析的jwt
                .parseClaimsJws(token).getBody();
        return claims;
    }
}
